package com.cw.jeeyt.service.intf.process;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;

import com.cw.jeeyt.common.DataTable;
import com.cw.jeeyt.common.ResultData;
import com.cw.jeeyt.common.process.Flow;

/**
 * TODO
 *
 * @author chenw
 * @date 2019/3/10 21:58
 */
public interface FlowTaskService {
    /**
     * 获取待办列表
     *
     * @param act 流程定义标识
     * @return
     */
    ResultData todoList(DataTable dataTable, Flow act);

    /**
     * 获取已发任务
     *
     * @param dataTable
     * @return
     */
    ResultData hasSentList(DataTable dataTable);

    /**
     * 获取已办任务
     *
     * @param dataTable
     * @param act 流程定义标识
     * @return
     */
    ResultData historicList(DataTable dataTable, Flow act);

    /**
     * 获取流转历史列表
     *
     * @param procInsId 流程实例
     * @param startAct 开始活动节点名称
     * @param endAct 结束活动节点名称
     */
    List<Flow> histoicFlowList(String procInsId, String startAct, String endAct);

    /**
     * 获取流程表单（首先获取任务节点表单KEY，如果没有则取流程开始节点表单KEY）
     *
     * @return
     */
    String getFormKey(String procDefId, String taskDefKey);

    /**
     * 获取流程实例对象
     *
     * @param procInsId
     * @return
     */
    ProcessInstance getProcIns(String procInsId);

    /**
     * 获取历史流程实例对象
     *
     * @param procInsId
     * @return
     */
    HistoricProcessInstance getHistoryProcIns(String procInsId);

    /**
     * 启动流程
     *
     * @param procDefKey 流程定义KEY
     * @param businessTable 业务表表名
     * @param businessId 业务表编号
     * @return 流程实例ID
     */
    String startProcess(String procDefKey, String businessTable, String businessId);

    /**
     * 启动流程
     *
     * @param procDefKey 流程定义KEY
     * @param businessTable 业务表表名
     * @param businessId 业务表编号
     * @param vars 流程变量
     * @return 流程实例ID
     */
    String startProcess(String procDefKey, String businessTable, String businessId, Map<String, Object> vars);

    /**
     * 获取任务
     *
     * @param taskId 任务ID
     */
    Task getTask(String taskId);

    /**
     * 删除任务
     *
     * @param taskId 任务ID
     * @param deleteReason 删除原因
     */
    void deleteTask(String taskId, String deleteReason);

    /**
     * 签收任务
     *
     * @param taskId 任务ID
     * @param userId 签收用户ID（用户登录名）
     */
    void claim(String taskId, String userId);

    /**
     * 提交任务, 并保存意见
     *
     * @param taskId 任务ID
     * @param procInsId 流程实例ID，如果为空，则不保存任务提交意见
     * @param comment 任务提交意见的内容
     * @param vars 任务变量
     */
    void complete(String taskId, String procInsId, String comment, Map<String, Object> vars);

    /**
     * 提交任务, 并保存意见
     *
     * @param taskId 任务ID
     * @param procInsId 流程实例ID，如果为空，则不保存任务提交意见
     * @param comment 任务提交意见的内容
     * @param title 流程标题，显示在待办任务标题
     * @param vars 任务变量
     */
    void complete(String taskId, String procInsId, String comment, String title, Map<String, Object> vars);

    /**
     * 完成第一个任务
     *
     * @param procInsId
     */
    void completeFirstTask(String procInsId);

    /**
     * 完成第一个任务
     *
     * @param procInsId
     * @param comment
     * @param title
     * @param vars
     */
    void completeFirstTask(String procInsId, String comment, String title, Map<String, Object> vars);

    /**
     * 添加任务意见
     */
    void addTaskComment(String taskId, String procInsId, String comment);

    /**
     * 流程跟踪图信息
     *
     * @param processInstanceId 流程实例ID
     * @return 封装了各种节点信息
     */
    List<Map<String, Object>> traceProcess(String processInstanceId) throws Exception;

    /**
     * 设置任务组
     *
     * @param vars
     * @param candidateGroupIdExpressions
     */
    void setTaskGroup(Map<String, Object> vars, Set<Expression> candidateGroupIdExpressions);

    /**
     * 获取当前节点信息
     *
     * @param processInstance
     * @return
     */
    Task getCurrentTaskInfo(ProcessInstance processInstance);
}
